/*
 * @Author: Xujianchen
 * @Date: 2024-12-16 11:33:26
 * @LastEditors: xujianchen
 * @LastEditTime: 2024-12-23 17:36:16
 * @Description: 常用时间、日期操作函数
 */
import dayjs from 'dayjs'
import customParseFormat from 'dayjs/plugin/customParseFormat'
import checkIsLeapYear from 'dayjs/plugin/isLeapYear'
import checkIsBetween from 'dayjs/plugin/isBetween'
import { isYMDFormat, isIosSafari } from '@/utils/regexp'
import { isString } from '@/utils/type'

dayjs.extend(customParseFormat)
dayjs.extend(checkIsLeapYear)
dayjs.extend(checkIsBetween)

/**
 * @description 计算两个日期的相差天数，格式必须是YYYY-MM-DD格式
 * @param {string} date1 第一个日期
 * @param {string} date2 第二个日期
 * @returns {number} 相差天数
 */
export function getDiffDay(date1, date2) {
  if (!date1 || !date2) return
  if (!isYMDFormat(date1) || !isYMDFormat(date2)) {
    throw new Error(
      `日期格式不正确，请传入${transformDateFormat('YYYY-MM-DD')}格式`,
    )
  }
  date1 = transformDateFormat(date1)
  date2 = transformDateFormat(date2)
  const d1 = dayjs(date1)
  const d2 = dayjs(date2)

  // FIXME: d1有可能早已d2，这时候会出现负数
  return Math.abs(d1.diff(d2, 'day'))
}

/**
 * @description 获取当前日期时间
 * @param {boolean} isHms 是否包含时分秒
 * @returns {string} 当前日期时间
 */
export function getCurrentDate(isHms = false) {
  const baseMode = transformDateFormat('YYYY-MM-DD')
  const mode = isHms ? `${baseMode} HH:mm:ss` : baseMode
  return dayjs().format(mode)
}

// 比较2个日期时间大小
export function compareDate(date1, date2) {
  if (!date1 || !date2) return

  const d1 = dayjs(date1, transformDateFormat('YYYY-MM-DD HH:mm:ss'))
  const d2 = dayjs(date2, transformDateFormat('YYYY-MM-DD HH:mm:ss'))

  return d1.isAfter(d2)
}

/**
 * @description 指定日期追加、减少n天
 * @param {string} dateString 指定日期
 * @param {number} n 增加、减少的天数
 * @param {string} type 操作类型，add：增加，subtract
 * @returns {string} 新日期
 */
export function adjustDays(dateString, n, type = 'add') {
  const date = dayjs(dateString, transformDateFormat('YYYY-MM-DD'))
  if (type === 'add') {
    return date.add(n, 'day').format(transformDateFormat('YYYY-MM-DD'))
  } else {
    return date
      .subtract(Math.abs(n), 'day')
      .format(transformDateFormat('YYYY-MM-DD'))
  }
}

// 获取当前时间戳
export function getCurrentTimestamp() {
  return dayjs().valueOf()
}

// 时间戳、日期相互转换
export function convertDateOrTimestamp(value) {
  if (isString(value) && value.includes('-')) {
    return dayjs(value, transformDateFormat('YYYY-MM-DD HH:mm:ss')).valueOf()
  }

  return dayjs(+value).format(transformDateFormat('YYYY-MM-DD HH:mm:ss'))
}

// 是否是闰年
export function isLeapYear(year) {
  const tYear = year || dayjs().year()
  return dayjs(`${tYear}-01-01`).isLeapYear()
}

// 判断某个日期是否在两个日期之间
export function isBetween(date, startDate, endDate) {
  const format = transformDateFormat('YYYY-MM-DD')
  const targetDate = dayjs(date, format)
  const start = dayjs(startDate, format)
  const end = dayjs(endDate, format)

  console.log(targetDate.isBetween(start, end))
  return targetDate.isBetween(start, end, null, '[]')
}

function transformDateFormat(date) {
  const isSafari = isIosSafari()
  return isSafari ? date.replace(/-/g, '/') : date
}
